import { IsString, IsNotEmpty, IsOptional, IsBoolean, ValidateNested, IsArray, Length, isNumber, IsNumber } from 'class-validator';
import { Type } from 'class-transformer';
import { PaginationDto } from '@dtos/pagination.dto';

export class DictPageDto extends PaginationDto {
  @IsString({ message: '关键字必须是字符串' })
  @IsOptional()
  @Length(1, 50, { message: '关键字长度必须在1-50之间' })
  keyword?: string;

  @IsBoolean({ message: '状态必须是布尔值' })
  @IsOptional()
  status?: boolean;
}

class DictItemDto {
  @IsString({ message: '标签必须是字符串' })
  @IsNotEmpty({ message: '标签不能为空' })
  label: string;

  @IsString({ message: '值必须是字符串' })
  @IsNotEmpty({ message: '值不能为空' })
  value: string;

  @IsBoolean({ message: '状态必须是布尔值' })
  @IsOptional()
  status?: boolean = true;
}

export class CreateDictWithItemsDto {
  @IsString({ message: '字典编码必须是字符串' })
  @IsNotEmpty({ message: '字典编码不能为空' })
  @Length(1, 50, { message: '字典编码长度必须在1-50之间' })
  code: string;

  @IsString({ message: '字典名称必须是字符串' })
  @IsNotEmpty({ message: '字典名称不能为空' })
  @Length(1, 10, { message: '字典名称长度必须在1-100之间' })
  name: string;

  @IsString({ message: '描述必须是字符串' })
  @IsOptional()
  @Length(1, 50, { message: '描述长度必须在1-50之间' })
  description?: string;

  @IsBoolean({ message: '是否系统内置必须是布尔值' })
  @IsOptional()
  isSystem?: boolean = false;

  @IsBoolean({ message: '状态必须是布尔值' })
  @IsOptional()
  status?: boolean = true;

  @IsArray({ message: '字典项列表必须是数组' })
  @ValidateNested({ each: true, message: '字典项格式不正确' })
  @Type(() => DictItemDto)
  items: DictItemDto[];
}

export class UpdateDictWithItemsDto extends CreateDictWithItemsDto {
  @IsNumber({ allowNaN: false }, { message: '字典ID必须是数字' })
  @IsNotEmpty({ message: '字典 ID 不能为空' })
  id: number;

  @IsString({ message: '字典名称必须是字符串' })
  @IsNotEmpty({ message: '字典名称不能为空' })
  @Length(1, 10, { message: '字典名称长度必须在1-100之间' })
  name: string;

  @IsString({ message: '字典编码必须是字符串' })
  @IsNotEmpty({ message: '字典编码不能为空' })
  @Length(1, 50, { message: '字典编码长度必须在1-50之间' })
  code: string;

  @IsString({ message: '描述必须是字符串' })
  @IsOptional()
  @Length(1, 50, { message: '描述长度必须在1-50之间' })
  description?: string;

  @IsBoolean({ message: '是否系统内置必须是布尔值' })
  @IsOptional()
  isSystem?: boolean = false;

  @IsBoolean({ message: '状态必须是布尔值' })
  @IsOptional()
  status?: boolean = true;

  @IsArray({ message: '字典项列表必须是数组' })
  @ValidateNested({ each: true, message: '字典项格式不正确' })
  @Type(() => DictItemDto)
  items: DictItemDto[];
}
